<?php

/**
 * 操作PostgreSQL数据库的主类
 */
class pgsql {  
    private $linkid; // PostgreSQL连接标识符  
    private $host; // PostgreSQL服务器主机  
    private $port; // PostgreSQL服务器主机端口  
    private $user; // PostgreSQL用户  
    private $passwd; // PostgreSQL密码  
    private $db; // Postgresql数据库  
    private $result; // 查询的结果  
    private $querycount; // 已执行的查询总数  

    /* 类构造函数，用来初始化$host、$user、$passwd和$db字段。 */  
    function __construct($host, $port ,$db, $user, $passwd) {  
        $this->host = $host;  
        $this->port = $port;  
        $this->user = $user;  
        $this->passwd = $passwd;  
        $this->db = $db;  
    }  
    /* 连接Postgresql数据库 */  
    function connect(){  
        try{  
            $this->linkid = @pg_connect("host=$this->host port=$this->port dbname=$this->db  
            user=$this->user password=$this->passwd");  
            if (! $this->linkid)  
            throw new Exception("Could not connect to PostgreSQL server.");  
        }  
        catch (Exception $e) {  
            die($e->getMessage());  
        }  
    }  

    /* 执行数据库查询。 */  
    function query($query){  
        try{  
            $this->result = @pg_query($this->linkid,$query);  
            if(! $this->result)  
            throw new Exception("The database query failed.");  
        }  
        catch (Exception $e){  
            echo $e->getMessage();  
        }  
        $this->querycount++;  
        return $this->result;  
    }  

    /* 确定受查询所影响的行的总计。 */ 
    /* 返回在 pg_query() 中执行 INSERT，UPDATE 和 DELETE 查询后受到影响的记录数目（包括实例／记录／行）。如果本函数没有影响到任何记录，则返回 0。 */ 
    function affectedRows(){  
        //$count = @pg_affected_rows($this->linkid); 
        $count = @pg_affected_rows($this->result);  
        return $count;  
    } 
     
    /* 确定查询返回的行的总计。 */  
    function numRows(){  
        $count = @pg_num_rows($this->result);  
        return $count;  
    } 

    /* 将查询的结果行作为一个对象返回。 */  
    function fetchObject(){  
        $row = @pg_fetch_object($this->result);  
        return $row;  
    } 

    /* 将查询的结果行作为一个索引数组返回。 */  
    function fetchRow(){  
        $row = @pg_fetch_row($this->result);  
        return $row;  
    } 

    /* 将查询的结果行作为一个关联数组返回。 */  
    function fetchArray(){  
        $row = @pg_fetch_array($this->result);  
        return $row;  
    }  

    /* 返回在这个对象的生存期内执行的查询总数。这不是必须的，但是您也许会感兴趣。 */  
    function numQueries(){  
        return $this->querycount;  
    }  

    //---------------//  //---------------//  //---------------//

    /**
     * 完成记录插入的操作
     * @param string $table
     * @param array $array
     * @return number
     */
    function insert($table,$array){
        $keys=join(",",array_keys($array));
        $vals="'".join("','",array_values($array))."'";
        $sql="insert into {$table}($keys) values ({$vals})";
        //var_dump($sql);       
        $ret = pg_query($this->linkid, $sql);
        if(!$ret){
            $err = pg_last_error($this->linkid);            
            echo("<script>console.log('".$err."')</script>");
        } else {
            $g1="Records created successfully!";
            echo("<script>console.log('".$g1."')</script>");
        }
        pg_close($this->linkid);        
        $count = @pg_affected_rows($ret);  
        return $count;
    }

    /* 不含单引号的插入方式（用得不多） */
    function insert2($table,$array){
        $keys=join(",",array_keys($array));
        $vals=join("','",array_values($array));
        $sql="insert into {$table}($keys) values ({$vals})";
        //var_dump($sql);        
        $ret = pg_query($this->linkid, $sql);
        if(!$ret){
            $err = pg_last_error($this->linkid); 
            echo("<script>console.log('".$err."')</script>");
        } else {
            $g1="Records created successfully!";
            echo("<script>console.log('".$g1."')</script>");
        }
        pg_close($this->linkid);       
        $count = @pg_affected_rows($ret);  
        return $count;
    }

    /**
     * 记录的更新操作
     * @param string $table
     * @param array $array
     * @param string $where
     * @return number
     */
    function update($table,$array,$where=null){
        $str=null;
        foreach($array as $key=>$val){
            if($str==null){
                $sep="";
            }else{
                $sep=",";
            }
            $str.=$sep.$key."='".$val."'";
        }
        $sql="update {$table} set {$str} ".($where==null?null:" where ".$where);       
        $result=pg_query($this->linkid, $sql);
        //var_dump($result);       
        if($result){
            return pg_affected_rows($result);
        }else{
            return false;
        }
        pg_close($this->linkid);
    }

    /**
     *	删除记录
    * @param string $table
    * @param string $where
    * @return number
    */
    function delete($table,$where=null){
        $where=$where==null?null:" where ".$where;
        $sql="delete from {$table} {$where}";        
        $result = pg_query($this->linkid, $sql);
        if(!$result){
            return false;
        }else{
            return pg_affected_rows($result);
        }        
        pg_close($this->linkid);
    }


    /**
     *得到指定一条记录
    * @param string $sql
    * @param string $result_type
    * @return multitype:
    */
    function fetchOne($sql){
        $result = pg_query($this->linkid, $sql);        
        if(!$result){
            return false;
        }else{
            $row=pg_fetch_array($result);
            //var_dump($row);            
            return $row;
        }
        pg_close($this->linkid);
    }


    /**
     * 得到结果集中所有记录 ...
     * @param string $sql
     * @param string $result_type
     * @return multitype:
     */
    function fetchAll($sql){
        $result = pg_query($this->linkid, $sql);
        if(!$result){
            return false;
        }else{
            while(@$row=pg_fetch_array($result)){
                $rows[]=$row;
            }
            return $rows;
        }
    }   

} //end_of_class-pgsql 